#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXR=109;
const ll MAXC=2009;
const ll MOD=998244353;
//相当于nR*nC的二维表格
ll nR,nC,sR[MAXR],a[MAXR][MAXC],f[MAXR][2*MAXR+1];
/*
f[r][d]表示只考虑前r行时
第c列选出总数减其他列总数恰为d的方案数
*/
ll id(ll d){return d+nR+1;}
/*
因为差值d可能为负数
d范围[-nR,nR] 
所以储存时平移:非负数d+nR+1对应d
使用函数id: d->d+nR+1
*/
int main(){
    //freopen("meal.in","r",stdin);
	//freopen("meal.out","w",stdout);
    cin>>nR>>nC;
    for(ll r=1;r<=nR;r++)
        for(ll c=1;c<=nC;c++){
            cin>>a[r][c];
            sR[r]=(sR[r]+a[r][c])%MOD;
        }
    //下面是0约束情况
    ll ans=1;
    for(ll r=1;r<=nR;r++){
        ans*=sR[r]+1;
        ans%=MOD;
    }
    ans=(ans-1+MOD)%MOD;//确保不出现负数
    //下面是正确的1约束情况
    for(ll c=1;c<=nC;c++){
        memset(f,0,sizeof(f));
        f[0][id(0)]=1;
        for(ll r=1;r<=nR;r++)
            for(ll d=-r;d<=r;d++){
                f[r][id(d)]=f[r-1][id(d)];
                f[r][id(d)]+=a[r][c]*f[r-1][id(d-1)];
                f[r][id(d)]+=(sR[r]-a[r][c])*f[r-1][id(d+1)];
                f[r][id(d)]%=MOD;
            }
        for(ll d=1;d<=nR;d++)
            ans=(ans-f[nR][id(d)]+MOD)%MOD;//确保不出现负数
    }
    cout<<ans<<endl;
    return 0;
}